package llvmir.value;

import java.util.ArrayList;
import java.util.List;

import llvmir.type.Type;
import mips.structure.MipsFunc;
import mips.value.MipsValue;
import mips.value.Register;

public abstract class Value {
    protected String name; // 一个元素的名字
    protected Type type; // 一个元素的类型

    private List<User> users; // 保存使用该元素的User

    // 一个value应该有一个属于自己的寄存器
    protected MipsValue register;
    // 寄存器也应该有一个指针指向该value
    protected MipsValue point;

    public Value(String name, Type type) {
        this.name = name;
        this.type = type;
        users = new ArrayList<>();
    }

    public String getName() {
        return name;
    }

    public Type getType() {
        return type;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setType(Type type) {
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }

    public MipsValue getRegister() {
        return register;
    }

    public MipsValue getPoint() {
        return point;
    }

    public void setRegister(MipsValue register) {
        this.register = register;
    }

    public void setPoint(MipsValue point) {
        this.point = point;
    }

    public void clearRegister(MipsFunc func) {
        if (register != null && register instanceof Register
                && (((Register) register).getType() == Register.Type.TEMPORARY)) {
            Register.releaseTempRegister((Register) register, func);
            register = null;
        }

    }
}
